package com.skt.common_hr.work_sac.model
{
	import com.wcl.utils.DateUtil;
	
	public class CalcOvertime
	{
		static private var OT_START:int = 19;
		static private var OT_END:int = 6;
		static private var NIGHT_START:int = 22
		static private var NIGHT_END:int = 6;


		static public function calcOverTime(begin:Date, end:Date, ref_b:int, ref_e:int, morning:Number=0, bBeginNextDay:Boolean=false, bEndNextDay:Boolean=false):Number
		{
			var retTime:Number = 0;
			var tmpNum:Number = 0;
			var divNum:Number = 0;
			var modNum:Number = 0;
			
			// 기준시간으로 Date객체를 생성
			var refBegin:Date = new Date(begin);
			refBegin.hours = ref_b;
			refBegin.minutes = refBegin.seconds = refBegin.milliseconds = 0;
			
			var refEnd:Date = new Date(begin);
			refEnd.hours = ref_e;
			refEnd.minutes = refEnd.seconds = refEnd.milliseconds = 0;
			
			
			// 기준 종료시간이 시작시간보다 작은 경우는 종료일자를 하나  증가시킨다.
			if(ref_b>ref_e) {
				refEnd.date++;
			}
			
			// Date 변경이 발생하므로 다른 객체로 변경한다.
			begin = new Date(begin); 
			end = new Date(end);
			
			/*
			end.fullYear = begin.fullYear;
			end.month = begin.month;
			end.date = begin.date;
			begin.seconds = end.seconds = begin.milliseconds = end.milliseconds = 0;
			
			// 시작시간이나 종료시간이 기준시간보다 작은 경우는 다음날로 가정
			if(begin.hours<=ref_e) begin.date++;
			if(end.hours<=ref_e) end.date++;
			*/
			
			// 종료시간이 시작시간을 앞서있을 경우 계산 안함
			if(Number(begin) < Number(end)) {
				var s:Date;
				var e:Date;
				if( Number(begin)>Number(refBegin)) s = begin;
				else s = refBegin;

				if( Number(end)>Number(refEnd)) e=refEnd;
				else e=end;
				trace(s.toString() + ", " + e.toString());
				if(Number(s) < Number(e)) {
					// OT 시간 계산
					retTime = ((Number(e) - Number(s))/(1000*60)) + morning;
					trace("차감전 : " + retTime);
					//retTime = Math.round(retTime - (int(retTime/4)+((retTime%4)>0?1:0))*.5);
					var baseTime:int = int(retTime/270)*30;
					var modTime:int = (retTime%270);
					modTime = (modTime>=240) ? modTime-240 : 0; 
					retTime -= baseTime+modTime;
					//retTime = Math.max(retTime-(div*30), (div*240)-((div-1)*30));
					trace("차감후 : tmpNum = " + tmpNum + ", retTime= " + (retTime-(30*tmpNum)) );
					//retTime = Math.round(retTime*100)/100;
					if(retTime < 0) retTime = 0;
				}
			}
			return retTime;
			
		}
		
		
		
		static public function calcOverTime_new(begin:Date, end:Date, ref_b:int, ref_e:int, morning:Number=0, bBeginNextDay:Boolean=false, bEndNextDay:Boolean=false):Number
		{
			var retTime:Number = 0;
			var tmpNum:Number = 0;
			var divNum:Number = 0;
			var modNum:Number = 0;
			
			// 기준시간으로 Date객체를 생성
			var refBegin:Date = new Date(begin);
			refBegin.hours = ref_b;
			refBegin.minutes = refBegin.seconds = refBegin.milliseconds = 0;
			
			var refEnd:Date = new Date(begin);
			refEnd.hours = ref_e;
			refEnd.minutes = refEnd.seconds = refEnd.milliseconds = 0;
			
			
			// 기준 종료시간이 시작시간보다 작은 경우는 종료일자를 하나  증가시킨다.
//			if(ref_b>ref_e) {
//				refEnd.date++;
//			}

			// ReqWorkTimeItemRenderer.mxml에서 getEndTime만 익일일때 date++ 처리를한다.
			// 기본 begin으로 시작, 끝 시간의 date객체를 생성하기 때문에,  ref를 생성후에 begin date의 날짜를 바꾼다.

			//if(bEndNextDay == true) {
				//refEnd.date++;					
			//}
			
			// Date 변경이 발생하므로 다른 객체로 변경한다.
			begin = new Date(begin); 
			end = new Date(end);
			
			if(bBeginNextDay == true) {
				begin.date++;	
			}
			
			/*
			end.fullYear = begin.fullYear;
			end.month = begin.month;
			end.date = begin.date;
			begin.seconds = end.seconds = begin.milliseconds = end.milliseconds = 0;
			
			// 시작시간이나 종료시간이 기준시간보다 작은 경우는 다음날로 가정
			if(begin.hours<=ref_e) begin.date++;
			if(end.hours<=ref_e) end.date++;
			*/
			
			// 종료시간이 시작시간을 앞서있을 경우 계산 안함
			if(Number(begin) < Number(end)) {
				var s:Date;
				var e:Date;
				if( Number(begin)>Number(refBegin)) {
					s = begin;
				} 
				else {
					s = refBegin;
				}

				if( Number(end)>Number(refEnd)) {
					// 익일이라면 
					if(bEndNextDay) {
						e=end;
					} else {
						e=refEnd;	
					}				
				}
				else {
					e=end;
				}
				trace(s.toString() + ", " + e.toString());
				
				if(Number(s) < Number(e)) {
					// OT 시간 계산
					retTime = ((Number(e) - Number(s))/(1000*60));
					
					if(bBeginNextDay==false) {
						retTime = retTime +  morning;
					}
					
					
					trace("차감전 : " + retTime);
					//retTime = Math.round(retTime - (int(retTime/4)+((retTime%4)>0?1:0))*.5);
					var baseTime:int = int(retTime/270)*30;
					var modTime:int = (retTime%270);
					modTime = (modTime>=240) ? modTime-240 : 0; 
					retTime -= baseTime+modTime;
					//retTime = Math.max(retTime-(div*30), (div*240)-((div-1)*30));
					trace("차감후 : tmpNum = " + tmpNum + ", retTime= " + (retTime-(30*tmpNum)) );
					//retTime = Math.round(retTime*100)/100;
					if(retTime < 0) retTime = 0;
				}
			}
			return retTime;
			
		}
		
		static public function calcMorningTime(begin:Date, end:Date):Number
		{
			var retTime:Number = 0;
			var e:Date = new Date(end);
			
			if(begin.hours<9) {
				if(begin.fullYear == end.fullYear && begin.month == end.month && begin.date == end.date) {
					if(end.hours>=9) {
						e.hours = 9; e.minutes = 0; e.seconds = 0;
					}
				}
				else {
					e = new Date(begin);
					e.hours = 9; e.minutes = 0; e.seconds = 0;
				}
				retTime = (Number(e) - Number(begin))/(1000*60);
			}
			return retTime;			
		}
	}
}